package cn.tedu.es.es;

import cn.tedu.es.entity.Student;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Highlight;
import org.springframework.data.elasticsearch.annotations.HighlightField;
import org.springframework.data.elasticsearch.annotations.HighlightParameters;
import org.springframework.data.elasticsearch.core.SearchHit;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import java.util.List;

/**
 * @author Amos
 * @date 2022/5/3
 * Repository
 * spring data 定义的一种数据访问规范，只需要定义接口，不用自己写代码
 * Repository的子接口spring可以自动扫描，创建动态代理对象
 */

public interface StudentRepository extends ElasticsearchRepository<Student, Long> {
    // 在姓名中搜索
    List<Student> findByName(String key);

    // 在姓名和出生日期中搜索
    List<Student> findByNameOrBirthData(String name, String birthData);

    /* 分页查询
        Pageable
            向服务器提交的分页参数
                - 页号：第一页是0
                - 每页大小
        Page(可选， 可以用 List)
            封装服务器返回的一页数据，和分页属性
                - 页号：第一页是0
                - 每页大小
                - 是否有上一页
                - 是否有下一页
                - 最大页号
                - 数据量
     */
    Page<Student> findByNameOrBirthData(String name, String birthData, Pageable pageable);
    /*
    SearchHit
        高亮的title: ["xxxx", "<em>","手机","</em>","xxxx","<em>","手机","</em>"]
        高亮的gender
        Student 包含学生的原始数据
     */
    @Highlight(
            parameters = @HighlightParameters(
                    preTags = "<em>",
                    postTags = "</em>"
            ),
            fields = {
                    @HighlightField(name = "name"),
                    @HighlightField(name = "gender")
            }
    )
    List<SearchHit<Student>> findByNameOrGender(String name, String gender);
}
